// #include <iostream>
// #include <pthread.h>
// #include <unistd.h>
// #include <string>

// // 创建一个互斥量(互斥锁)
// pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
// // 创建一个条件变量
// pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
// int num = 100;

// void *start_routine(void *argc)
// {
//     std::string namestr = static_cast<const char *>(argc);
//     while (true)
//     {
//         // 申请锁
//         pthread_mutex_lock(&mutex);

//         // 加入cond等待队列等待唤醒
//         pthread_cond_wait(&cond, &mutex);

//         // 唤醒之后完成打印工作
//         if (num > 0)
//         {
//             //sleep(1);
//             std::cout << namestr << " num : " << num-- << std::endl;
//             pthread_mutex_unlock(&mutex);
//         }
//         else
//         {
//             std::cout <<"没票了"<< std::endl;
//             pthread_mutex_unlock(&mutex);
//             break;
//         }

//         // 关闭锁
//         pthread_mutex_unlock(&mutex);
//         // 之后再去申请锁，等待，打印，关闭锁。循环下去。
//     }
// }

// int main()
// {
//     pthread_t t[5];

//     // 先创建五个线程
//     for (int i = 0; i < 5; i++)
//     {
//         char *name = new char[64];
//         snprintf(name, 64, "thread %d", i + 1);
//         pthread_create(t + i, nullptr, start_routine, (void *)name);
//         pthread_detach(t[i]);
//     }

//     sleep(5);
//     std::cout << "五个线程全部被创建完成，并且都在cond等待队列里面等待被唤醒" << std::endl;
//     // 走到这里五个线程全部被创建完成，并且都在cond等待队列里面等待被唤醒。

//     while (true)
//     {
//         //usleep(1463);
//         sleep(1);
//         //int ret = pthread_cond_signal(&cond); // 每次唤醒cond等待队列中的一个线程。
//         int ret = pthread_cond_broadcast(&cond);
//         // 这里是非阻塞的，没有唤醒成功不会报错。
//         if (ret != 0)
//         {
//             break;
//         }
//         std::cout << "main thread wakeup one thread" << std::endl;
//     }

//     for (int i = 0; i < 5; i++)
//     {
//         pthread_join(t[i], nullptr);
//     }
//     return 0;
// }

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
void *thread_run(void *arg)
{
    pthread_detach(pthread_self());
    printf("%s\n", (char *)arg);
    return NULL;
}
int main(void)
{
    pthread_t tid;
    if (pthread_create(&tid, NULL, thread_run, (void*)"thread1 run...") != 0)
    {
        printf("create thread error\n");
        return 1;
    }
    int ret = 0;
    sleep(1); // 很重要，要让线程先分离，再等待
    if (pthread_join(tid, NULL) == 0)
    {
        printf("pthread wait success\n");
        ret = 0;
    }
    else
    {
        printf("pthread wait failed\n");
        ret = 1;
    }
    return ret;
}